﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using Microsoft.Win32;
using System.IO;
using EntitiesLayer;

namespace DataLayer.Logger
{
     public static class Logger
    {

        /// <summary>
        /// Decode Error codes.
        /// </summary>
        /// <param name="tipoError"></param>
        /// <returns></returns>
        public static String MensajeError(int tipoError)
        {
            switch (tipoError)
            {
                case 0:
                    return "Error Message";
                case 1:
                    return "Log Message";
                case 2:
                    return "Information Message";
                case 3:
                    return "Proccess Message";
                default:
                    return "Error de configuracion: Error Type solo puede ser de 0 - 3. Valor Actual: " + tipoError;
            }
        }


        /// <summary>
        /// Determine if write depending of level log.
        /// </summary>
        /// <param name="tipoError"></param>
        /// <returns></returns>
        public static bool IfWrite(int tipoError)
        {
            switch (tipoError)
            {
                case 0:
                    {
                        return Configuration.Error_Message;
                    }
                case 1:
                    {
                        return Configuration.Log_Message;
                    }
                case 2:
                    {
                        return Configuration.Information_Message;
                    }
                case 3:
                    {
                        return Configuration.Process_Message;
                    }
                default:
                    {
                        throw new Exception("Error del sistema: el tipo de error solo puede ser de 0 - 3. Valor Actual: " + tipoError);
                    }
            }
           
        }


         /// <summary>
         /// 
         /// </summary>
         /// <returns></returns>
        public static bool GenerarArchivoBitacora()
        {
            return Configuration.FileSystemLog;

        }



        /// <summary>
        /// Write Logs in File System
        /// </summary>
        /// <param name="mensaje"></param>
        /// <param name="appConfig"></param>
        public static void EscribirArchivo(string mensaje)
        {
            int contadorLog = 0;
            string nombreArchivoLog = Configuration.logLocation + "\\" + Configuration.systemID + "-" + DateTime.Now.ToString("yyyyMMdd") + ".Log";

            if (!(Directory.Exists(Configuration.logLocation)))
                Directory.CreateDirectory(Configuration.logLocation);
            try
            {
                using (StreamWriter swLocalLog = new StreamWriter(nombreArchivoLog, true))
                {
                    swLocalLog.WriteLine(mensaje);
                    swLocalLog.Flush();
                }

                FileInfo fileProps = new FileInfo(nombreArchivoLog);
                if (fileProps.Length > (Configuration.logMaxSizeBytes * 1000))
                {
                    while (true)
                        try
                        {
                            File.Move(nombreArchivoLog, nombreArchivoLog + contadorLog.ToString() + ".old");
                            break;
                        }
                        catch { contadorLog++; }
                }
            }

            catch (Exception exc)
            {
                throw new Exception("Imposible escribir en el logFile " + exc.Message);
            }

        }

        /// <summary>
        /// Write events to Windows Event Viewer, reading configurations file for the application.
        /// </summary>
        /// <param name="msgText">Text to be written to the log.</param>
        public static void LogWindows(string msgText, string nombreEventSource, string nombreEventLog)
        {
            try
            {
                EventLog servicioWindowsLog = new EventLog();
                if (!EventLog.SourceExists(nombreEventSource))
                {
                    EventLog.CreateEventSource(nombreEventSource, nombreEventLog);
                }
                servicioWindowsLog.Log = nombreEventLog;
                servicioWindowsLog.Source = nombreEventSource;
                servicioWindowsLog.WriteEntry(msgText, EventLogEntryType.Error);
            }
            catch (Exception /*exc*/)
            {
            }
        }


    }
}
